<?php

/***************** 4.13 查找通过某个测试的元素 **********/

// 问题
// 希望找出数组中满足某些需求的元素

// 解决方案
// 可以使用 foreach 或者 array_filter()

$fruits = ['Cherry', 'Peach', 'apple', 'banana', 'pear'];

$movies = [
    ['id' => 1, 'box_office_gross' => 500],
    ['id' => 2, 'box_office_gross' => 600],
    ['id' => 3, 'box_office_gross' => 700],
];

$flops = [];
foreach ($movies as $movie) {
    if ($movie['box_office_gross'] < 700) {
        $flops[] = $movie;
    }
}

//var_dump($flops);
//array(2) {
//  [0]=>
//  array(2) {
//    ["id"]=>
//    int(1)
//    ["box_office_gross"]=>
//    int(500)
//  }
//  [1]=>
//  array(2) {
//    ["id"]=>
//    int(2)
//    ["box_office_gross"]=>
//    int(600)
//  }
//}


/*************************
 *
 * foreach 循环很简单，只需要迭代处理数据，将满足条件的元素追加到返回数组中
 * 如果只想得到第一个满足条件的元素，可以使用 break 退出循环
 *
 */

foreach ($movies as $items) {
    if ($items['box_office_gross'] > 600) {
        $blockBuster = $items;
        break;
    }
}

//var_dump($blockBuster);
//array(2) {
//  ["id"]=>
//  int(3)
//  ["box_office_gross"]=>
//  int(700)
//}

// 可以直接从函数返回

function blockbuster($movies)
{
    foreach ($movies as $movie) {
        if ($movie['box_office_gross'] > 600) {
            return $movie;
        }
    }
}

$res = blockBuster($movies);
//var_dump($res);
//array(2) {
//  ["id"]=>
//  int(3)
//  ["box_office_gross"]=>
//  int(700)
//}

/****************************
 *
 * array_filter 时，首先要创建一个匿名函数，对于想保留的值返回 true
 * 对于不想保留的返回 false ,
 * 再者 array_filter() 不能提前退出，也就是没有 foreach() 灵活
 *
 */

$result = array_filter($movies, function ($array) {
    if ($array['box_office_gross'] < 600) {
        return true;
    }
});

//var_dump($result);
//array(1) {
//  [0]=>
//  array(2) {
//    ["id"]=>
//    int(1)
//    ["box_office_gross"]=>
//    int(500)
//  }
//}





